// 逆波兰表达式是一种后缀表达式，运算符写在后面
// 逆波兰表达式主要有以下两个优点：
// 1. 去掉括号后表达式无歧义，上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
// 2. 适合用栈操作运算：遇到数字则入栈；遇到运算符则取出栈顶两个数字进行计算，并将结果压入栈中。

// 思路，堆栈
function evalRPN(tokens) {
    let stack = []
    for (let i = 0; i < tokens.length; i++) {
        if (Number.isNaN(Number(tokens[i]))) {
            let num1 = stack.pop()
            let num2 = stack.pop()
            switch (tokens[i]) {
                case '+':
                    stack.push(num1 + num2)
                    break;
                case '-':
                    stack.push(num1 - num2)
                    break;
                case '*':
                    stack.push(num1 * num2)
                    break;
                case '/':
                    stack.push(num1 / num2 | 0)
                    break;
                default:
                    break;
            }
        } else {
            stack.push(Number(tokens[i]))
        }
    }
    return stack[0]
}


tokens = ["2","1","+","3","*"]
console.log(evalRPN(tokens))